package com.eds.utils;

// 导入需要的类
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

public class CaptchaUtils {
    // 定义验证码可能包含的字符集合，排除了容易混淆的字符如0、1、O等
    private static final String CHARS = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
    // 定义生成验证码图片的宽度
    private static final int WIDTH = 120;
    // 定义生成验证码图片的高度
    private static final int HEIGHT = 38;

    // 内部静态类Captcha用于封装生成的验证码字符串和对应的BufferedImage对象
    public static class Captcha {
        private String code; // 验证码字符串
        private BufferedImage image; // 验证码图片

        // 构造函数，初始化code和image属性
        public Captcha(String code, BufferedImage image) {
            this.code = code;
            this.image = image;
        }

        // 获取验证码字符串
        public String getCode() { return code; }
        // 获取验证码图片
        public BufferedImage getImage() { return image; }
    }

    // 生成验证码的方法
    public static Captcha generateCaptcha() {
        // 创建指定宽高的BufferedImage对象作为验证码图片的基础
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = image.createGraphics(); // 获取绘图上下文

        // 设置背景颜色为白色
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, WIDTH, HEIGHT); // 填充矩形区域作为背景

        // 实例化Random对象用于生成随机数
        Random random = new Random();
        StringBuilder code = new StringBuilder(); // 用于存储生成的验证码字符串

        // 循环四次，每次生成一个字符并添加到验证码字符串中
        for (int i = 0; i < 4; i++) {
            String char1 = String.valueOf(CHARS.charAt(random.nextInt(CHARS.length()))); // 随机选择一个字符
            code.append(char1); // 将字符添加到验证码字符串

            // 设置随机颜色用于绘制字符
            g2d.setColor(new Color(random.nextInt(88), random.nextInt(188), random.nextInt(255)));
            // 设置随机字体大小和样式用于绘制字符
            g2d.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 28 + random.nextInt(10)));

            // 计算旋转角度，并应用旋转变换
            double theta = random.nextInt(45) * Math.PI / 180;
            g2d.rotate(theta, 25 * (i + 1), HEIGHT/2);
            // 在计算好的位置绘制字符
            g2d.drawString(char1, 20 * (i + 1), 25);
            // 反向旋转恢复原始坐标系
            g2d.rotate(-theta, 25 * (i + 1), HEIGHT/2);
        }

        // 添加干扰线，增加验证码识别难度
        for (int i = 0; i < 6; i++) {
            g2d.setColor(new Color(random.nextInt(188), random.nextInt(188), random.nextInt(188)));
            g2d.drawLine(random.nextInt(WIDTH), random.nextInt(HEIGHT),
                    random.nextInt(WIDTH), random.nextInt(HEIGHT));
        }

        // 添加噪点，进一步增加验证码识别难度
        for (int i = 0; i < 30; i++) {
            g2d.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
            g2d.fillRect(random.nextInt(WIDTH), random.nextInt(HEIGHT), 2, 2);
        }

        g2d.dispose(); // 释放绘图资源
        // 返回封装了验证码字符串和图片的Captcha对象
        return new Captcha(code.toString(), image);
    }
}